package com.chimm.service;

import com.chimm.dto.Exposer;
import com.chimm.dto.SeckillExecution;
import com.chimm.entity.Seckill;
import com.chimm.excetion.RepeatKillException;
import com.chimm.excetion.SeckillCloseException;
import com.chimm.excetion.SeckillException;

import java.util.List;

/**
 * 秒杀业务接口 : 站在"使用者"角度设计接口
 * 三个方面: 方法定义的粒度 , 参数 , 返回类型(return 类型/异常)
 */
public interface SeckillService {

    /**
     * 查询所有秒杀记录
     *
     * @return List<Seckill>
     */
    List<Seckill> getSeckkillList();


    /**
     * 查询单个秒杀结果
     *
     * @param seckillId 秒杀商品ID
     * @return
     */
    Seckill getById(long seckillId);


    /**
     * 秒杀开启时输出秒杀接口地址,
     * 否则输出系统时间和秒杀时间
     *
     * @param seckillId 秒杀商品ID
     * @return Exposer 暴露秒杀地址DTO
     */
    Exposer exportSeckillUrl(long seckillId);

    /**
     * 执行秒杀
     *
     * @param seckillId 秒杀商品ID
     * @param userPhone 用户手机号
     * @param md5
     */
    SeckillExecution executeSeckill(long seckillId, long userPhone, String md5) throws SeckillException, RepeatKillException, SeckillCloseException;


    /**
     * 执行秒杀 by 存储过程
     *
     * @param seckillId 秒杀商品ID
     * @param userPhone 用户手机号
     * @param md5
     */
    SeckillExecution executeSzeckillByProcedure(long seckillId, long userPhone, String md5) throws SeckillException, RepeatKillException, SeckillCloseException;
}
